package com.tanhua.server.serivce;

import com.alibaba.fastjson.JSON;
import com.tanhua.autoconfig.template.AipFaceTemplate;
import com.tanhua.autoconfig.template.HuanXinTemplate;
import com.tanhua.autoconfig.template.OssTemplate;
import com.tanhua.commons.utils.JwtUtils;
import com.tanhua.dubbo.api.UserApi;
import com.tanhua.dubbo.api.UserInfoApi;
import com.tanhua.model.db.User;
import com.tanhua.model.db.UserInfo;
import com.tanhua.model.vo.ErrorResult;
import com.tanhua.server.exception.BusinessException;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

@Service
public class UserService {

    //调用dubbo服务
    @DubboReference
    private UserApi userApi; //只会提供数据服务（操作数据）

    @DubboReference
    private UserInfoApi userInfoApi;

    @Autowired
    private RedisTemplate<String,String> redisTemplate;

    @Autowired
    private OssTemplate ossTemplate;

    @Autowired
    private HuanXinTemplate huanXinTemplate;

    @Autowired
    private AipFaceTemplate aipFaceTemplate;
//
//    @Autowired
//    private RabbitTemplate rabbitTemplate;

    @Autowired
    private MqMessageService messageService;

    @Autowired
    private UserStatusService userStatusService;

    //根据手机号查询用户
    public User findUserByMobile(String mobile) {
        return userApi.findByMobile(mobile);
    }

    /**
     * 登录校验方法
     *  verifiCode ：用户输入的验证码
     */
    public Map loginVerification(String phone, String verifiCode) {
        //根据手机号，查询用户数据，如果数据不存在，构造数据保存到数据库中（注册）
        User user = userApi.findByMobile(phone);
        //判断该用户的登陆权限是否被冻结,如果被冻结,抛出登陆冻结异常
        Boolean freeze = userStatusService.findFreeze(user);
        if (freeze) {
            throw new BusinessException(ErrorResult.freezeError());
        }
        //1、判断用户输入的验证码和redis中存储验证码是否一致
        //1.1 从redis中获取验证码
        String code = redisTemplate.opsForValue().get("CODE_" + phone);
        //1.2 判断redis中的验证码是否存在，和用户输入的是否一致
        if(StringUtils.isEmpty(code) || !code.equals(verifiCode)) {
            //1.3 redis验证码不存在或者和输入的不一致。验证码
            //抛出异常
            ErrorResult result = ErrorResult.loginError(); //错误信息
            throw new BusinessException(result); //抛出自定义异常，指定一些返回的数据
        }
        //1.4 如果一致，删除验证码
        redisTemplate.delete("CODE_" + phone);
        //2.1 如果用户不存在，保存到数据
        Boolean isNew = false;
        String type = "0101";
        if(user == null) {
            user = new User();
            user.setMobile(phone);
            user.setPassword("123456");
            Long id = userApi.save(user);//这里有一个问题
            user.setId(id);
            System.out.println("服务消费者保存之后id="+user.getId());
            isNew = true;

            //将用户信息注册到环信
            String hxUser = "hx"+user.getId();
            String hxPassword = "123456";
            huanXinTemplate.createUser(hxUser,hxPassword);
            user.setHxUser(hxUser);
            user.setHxPassword(hxPassword);
            userApi.update(user);
            type = "0102";
        }

        messageService.sendLogService(user.getId(),type,"user","");

//        try {
//            Map<String,String> message = new HashMap();
//            message.put("userId",user.getId().toString());
//            message.put("type",type);
//            message.put("logTime",new SimpleDateFormat("yyyy-MM-dd").format(new Date()));
//            //将对象转化json，发送
//            String msg = JSON.toJSONString(message);
//            //发送日志消息（登录或者注册）
//            rabbitTemplate.convertAndSend("tanhua.log.exchange","log.user",msg);//交换机，路由键，消息
//        }catch (Exception e) {}


        //3、借助JWT生成token字符串(token中存放用户id和手机号)
        Map tokeMap = new HashMap();
        tokeMap.put("id",user.getId());
        tokeMap.put("mobile",user.getMobile());
        String token = JwtUtils.getToken(tokeMap);
        //4、构造返回值并返回
        Map retMap = new HashMap();
        retMap.put("token",token);
        retMap.put("isNew",isNew) ;//true:新用户，false：老用户
        return retMap;
    }

    //保存用户信息
    public void saveUserInfo(UserInfo userInfo) {
        userInfoApi.save(userInfo);
    }

    //更新用户头像
    public void head(Long userId, MultipartFile headPhoto) throws IOException {
        //1、将文件上传到阿里云OSS
        String avatar = ossTemplate.upload(headPhoto.getOriginalFilename(),
                headPhoto.getInputStream());//文件名，文件的输入流
        //2、调用百度云，验证图片中是否包含人脸
        Boolean detect = aipFaceTemplate.detect(avatar); //true-包含人脸，false-不包含
        if(!detect) {
            ErrorResult result = ErrorResult.faceError();
            throw new BusinessException(result);
        }
        //3、调用API，更新用户信息
        UserInfo info = new UserInfo();  //根据id更新
        info.setId(userId);
        info.setAvatar(avatar);
        userInfoApi.update(info);
    }
}
